#ifndef __log_H__
#define __log_H__

#include "func.h"
#include "pthreadpool.h"

/*
//用于测试，可忽略结构体，在服务器端定义过
//若要单独测试可打开*注释,进maintext测试
typedef struct tasknode{
    int peerfd;
    struct tasknode* next;
}task_t;
//
typedef struct taskqueue{
    task_t* front;
    task_t* rear;
    int size;
    int maxsize;
    pthread_cond_t notfull;
    pthread_cond_t notempty;
    int exitflag;
    pthread_mutex_t mutex;
}taskqueue_t;
//
typedef struct pthreadpool{
    taskqueue_t queue;
    pthread_t* index;
    int pthreadnum;
    pthread_mutex_t mutex;
}pthreadpool_t;
*/

//最大日志记录长度
#define MAX_LOG_LEN 1024

//添加了打印语句所在的文件，行号，函数信息
#define CMD_LOG(pthreadpool, clientName, maxLevel, myLevel, fmt, argc...)\
    mylog(pthreadpool, clientName, maxLevel, myLevel, "[file:%s, line:%d, func:%s]" fmt,\
                __FILE__,  __LINE__, __FUNCTION__, ##argc)

//获取当前时间
void get_current_time(char* buff, int len);

//va_list是在C语言中解决变参问题的一组宏
//变参问题是指参数的个数不定
//可以是传入一个参数也可以是多个
//可变参数中的每个参数的类型可以不同,也可以相同
//可变参数的每个参数并没有实际的名称与之相对应
void vlog_message(int level, char* clientName, char* fmt, va_list args);

//C 库宏 void va_start(va_list ap, last_arg) 初始化 ap 变量
//它与 va_arg 和 va_end 宏是一起使用的
//last_arg 是最后一个传递给函数的已知的固定参数
//即省略号之前的参数
//
//C 库宏 void va_end(va_list ap) 
//允许使用了 va_start 宏的带有可变参数的函数返回
//如果在从函数返回之前没有调用 va_end，则结果为未定义。
//void log_message(int level, char* fmt, ...);

//最终日志函数
//进程池，客户名，设置最高可记录日志信息的等级，当前记录日志的等级, 消息...
void mylog(pthreadpool_t pthreadpool, char *clientName, int maxLevel, int myLevel, char* fmt, ...);

#endif
